#!/bin/bash

# 安装 sshpass
install_sshpass() {
    if ! command -v sshpass &> /dev/null; then
        echo "安装 sshpass..."
        sudo dnf install -y sshpass
    else
        echo "sshpass 已经安装."
    fi
}

initEnv(){
#关闭防火墙
systemctl stop firewalld.service
#禁用防火墙
systemctl disable firewalld.service
#检查防火墙
Isactive=$(systemctl status firewalld | grep Active | awk '{print $2}')

if [ $Isactive == 'active' ] 
then
    echo $Isactive
    echo '防火墙没有关闭成功！'
else
    echo '防火墙关闭成功!'
fi

#获取当前主机名
current_host=$(hostname)

#获取当前IP
IP=$(ip addr | grep inet | grep -v inet6 |awk '{print $2}'|cut -d/ -f1 | awk 'NR==2{print $0}')
#获取当前网关
GATEWAY_IP=$(ip route | awk '/default/ {print $3}')

echo "当前主机IP:${IP}"

echo "设置IP固定#######################################"

#文件路径
file_path="/etc/sysconfig/network-scripts/ifcfg-ens160"

# 定义要追加的内容
additional_lines=$(cat <<EOF
IPADDR=${IP}
NETMASK=255.255.255.0
GATEWAY=${GATEWAY_IP}
DNS1=8.8.8.8
EOF
)
# 检查文件中是否已存在要追加的内容，如果存在则不再添加 TODO:优化匹配
if grep -q "NETMASK=255.255.255.0" /etc/sysconfig/network-scripts/ifcfg-ens160; then
    echo "要追加的内容已存在，不需要再添加"
else
    # 使用 sed 替换 IP 地址
    sed -i "s/^BOOTPROTO=.*/BOOTPROTO=static/" "$file_path"
    sed -i "s/^ONBOOT=.*/ONBOOT=yes/" "$file_path"
    # 使用 echo 将多行内容追加到文件末尾
    echo "$additional_lines" >> "$file_path"
    echo "已成功追加多行内容"
    #重新加载网关
    nmcli c reload
fi

}

#配置免密登录
initSSh(){
    #获取主机列表
    hosts=($(cat /etc/hosts| grep -v '^$' | awk 'NR==3,NR==5{print $2}'))
    #获取当前主机名
    host_name=$(hostname)
    # 生成SSH密钥对
    ssh-keygen -t rsa

    #循环遍历虚拟机列表，将公钥拷贝到每台虚拟机上
    if [ $host_name = "${hosts[0]}" ]
    then
        for node in "${hosts[@]}"
        do

            # 拷贝公钥到虚拟机
            ssh-copy-id -o StrictHostKeyChecking=no "root@$node"
    
        done
    fi

    sed -i '$ a AllowTcpForwarding yes' /etc/ssh/sshd_config&& systemctl restart sshd
    # 提示用户输入密码
    echo "请输入密码："
    read -s PASSWORD

    cat ~/.ssh/id_rsa.pub | sshpass -p "$PASSWORD" ssh -o "StrictHostKeyChecking=no" root@${hosts[0]} 'cat >> ~/.ssh/authorized_keys'
    echo "免密登录已设置完成。"


}

#分发文件
scopy(){
   
    #获取当前主机名
    host_name=$(hostname)
    # tar_file=$(ls -l | grep '^d' | awk '{print $9}')
     #获取主机列表
    hosts=($(cat /etc/hosts| grep -v '^$' | awk 'NR==3,NR==5{print $2}'))
    # 循环遍历虚拟机列表，将公钥拷贝到每台虚拟机上
    #获取文件路径
    path=$(pwd)
    if [ $host_name = "${hosts[0]}" ]
    then
        for((i = 1; i < ${#hosts[@]}; i++))
        do
            #修该主机名
            ssh root@${hosts[i]} "hostnamectl set-hostname ${hosts[i]}"
            #创建文件夹
            ssh root@${hosts[i]} "mkdir -p $path"
            #分发脚本文件
            scp -r * root@${hosts[i]}:$path
            #执行初始化脚本
             # 使用 "$1[@]" 来获取传递的关联数组
             local -n arr=$1
             result=""
            for k in "${!arr[@]}"
            do
                echo "Key: $k, Value: ${arr[$k]}"
                result+=" $k ${arr[$k]} "
            done

            ssh root@${hosts[i]} "$path/init.sh$result"
        done

        for((i = 1; i < ${#hosts[@]}; i++))
        #分发免密登录文件
        do
           scp ~/.ssh/authorized_keys root@${hosts[i]}:~/.ssh/
        done
   
    fi

}
#远程执行解压
ssh_tar(){
     #获取当前主机名
    host_name=$(hostname)
    # tar_file=$(ls -l | grep '^d' | awk '{print $9}')
     #获取主机列表
    hosts=($(cat /etc/hosts| grep -v '^$' | awk 'NR==3,NR==5{print $2}'))
    if [ $host_name = "${hosts[0]}" ]
    then
        for((i = 0; i < ${#hosts[@]}; i++))
        do 
            ssh root@${hosts[i]} "/app/tarSoftware.sh"

            ssh root@${hosts[i]} "/app/initEnv.sh && source /etc/profile"

            ssh root@${hosts[i]} "/app/hadoop.sh && source /etc/profile" 

            ssh root@${hosts[i]} "/app/zookeeper.sh && source /etc/profile"

            ssh root@${hosts[i]} "/app/spark.sh && source /etc/profile"

        
        done
            hdfs namenode -format
   
    fi



 
}
#声明关联数组
declare -A site

# 默认的 hosts 文件路径
hosts_file="/etc/hosts"

#获取当前IP
IP=$(ip addr | grep inet | grep -v inet6 |awk '{print $2}'|cut -d/ -f1 | awk 'NR==2{print $0}')

# 检查参数数量是否为偶数，因为每个主机名都应该有对应的 IP 地址
if [ $(($# % 2)) -ne 0 ]; then
    echo "参数数量必须为偶数，每个主机名应有对应的 IP 地址。"
    exit 1
fi

# 备份 hosts 文件
backup_file="$hosts_file.bak"
cp "$hosts_file" "$backup_file"

# 如果没有传递参数，则显示帮助信息
if [ $# -eq 0 ]; then
    echo "没有传参，传参格式为 init.sh node1 192.168.88.123 node2 192.168.88.124"
    exit 1
fi
#判断字段是否已存在
if grep -q "$1" /etc/hosts;then
     echo "已包含，请清空/etc/hosts 节点信息"
      for ((i = 1; i <= $#; i+=2))
        do
            hostname="${!i}"
            next_index=$((i + 1))
            eval ip="\${$next_index}"
            #设置主机名
            if [ $ip = $IP ]
            then
                hostnamectl set-hostname $hostname
            fi
            #存储数据
            site[$hostname]=$ip
        done

else
    # 循环读取参数，每两个参数表示一个主机名和对应的 IP 地址
    for ((i = 1; i <= $#; i+=2))
    do
        hostname="${!i}"
        next_index=$((i + 1))
        eval ip="\${$next_index}"
        #存储数据
        site[$hostname]=$ip
        echo "$ip $hostname" >> $hosts_file
    done
    echo "hosts 文件已更新。"
fi


install_sshpass

echo -e "##########################开始初始化环境############################################"

initEnv

echo -e "##########################初始化环境结束############################################"


echo -e "##########################开始配置免密登录#########################################"
initSSh

echo -e "#############################免密配置完成#########################################"

echo -e "******************************开始分发文件,初始化其他宿主机****************************************"

scopy site

echo -e "******************************分发与初始化环境已完成****************************************"
ssh_tar

